home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / dirtool / readdir.asm next >
Encoding:
Assembly Source File  |  1980-01-04  |  5.5 KB  |  192 lines

  1.     include    "exec/types.i"
  2.     include    "exec/memory.i"
  3.     include    "libraries/dos.i"
  4.  
  5.     xref    _LVOOpenLibrary,_LVOCloseLibrary
  6.     xref    _LVOAllocMem,_LVOFreeMem,_LVORawDoFmt,_LVOSetSignal
  7.     xref    _LVOOutput,_LVOWrite,_LVOLock,_LVOUnLock
  8.     xref    _LVOExamine,_LVOExNext,_LVOIoErr,_LVOCurrentDir
  9.  
  10. exec    macro                ; makro exec-rutiinien kutsumiseen
  11.     move.l    $4,a6            ; execbase a6:een
  12.     jsr    _LVO\1(a6)        ; jsr _LVOxxx(a6)
  13.     endm
  14. dos    macro                ; makro dos-rutiinien kutsumiseen
  15.     move.l    a4,a6            ; dosbase a6:een
  16.     jsr    _LVO\1(a6)        ; jsr _LVOxxx(a6)
  17.     endm
  18.  
  19. BUFFER    equ    256            ; tulostuspuskurin koko
  20.  
  21. main    clr.b    -1(a0,d0.l)        ; nolla komentorivin loppuun
  22.     move.l    a0,a2            ; komentorivin osoite a2:een
  23.  
  24.     lea    dosname(pc),a1        ; dos-kirjaston nimi
  25.     moveq    #0,d0            ; versio (mikä tahansa)
  26.     exec    OpenLibrary        ; avataan dos
  27.     move.l    d0,a4            ; dos-perusosoite a4:ään
  28.     tst.l    d0            ; aukesiko kirjasto?
  29.     beq    cleanup            ; ei -> pois
  30.  
  31.     move.l    #BUFFER,d0        ; tulostuspuskurin koko
  32.     moveq    #MEMF_PUBLIC,d1        ; muistityyppi
  33.     exec    AllocMem        ; varataan muistia
  34.     move.l    d0,a5            ; puskurin osoite talteen a5:een
  35.     tst.l    d0            ; saatiinko muistia?
  36.     beq    cleanup            ; ei -> pois
  37.  
  38.     lea    spce(pc),a0        ; spaceja nimien sisennystä varten
  39.     move.l    a0,d5            ; spacejen loppuosoite d5:een
  40.     bsr    dir_it            ; tulostetaan hakemisto!
  41.  
  42. cleanup    move.l    a5,d0            ; muistia varattu?
  43.     beq.s    100$            ; ei -> hypätään yli
  44.     move.l    d0,a1            ; joo -> osoite a1:een
  45.     move.l    #BUFFER,d0        ; ja koko d0:aan
  46.     exec    FreeMem            ; vapautetaan muisti
  47.  
  48. 100$    move.l    a4,d0            ; dos-kirjasto auki?
  49.     beq.s    110$            ; ei -> hypätään yli
  50.     move.l    d0,a1            ; perusosoite a1:een
  51.     exec    CloseLibrary        ; suljetaan dos
  52. 110$    moveq    #0,d0            ; ei virhettä!
  53.     rts                ; pois
  54.  
  55.  
  56. dir_it    moveq    #0,d6            ; ei ole vielä Lockattu
  57.     moveq    #-1,d4            ; eikä CurrentDirrattu
  58.     move.l    #fib_SIZEOF,d0        ; varataan tilaa FIBille
  59.     moveq    #MEMF_PUBLIC,d1        ; muistityyppi
  60.     exec    AllocMem        ; varaatn muisti
  61.     move.l    d0,d7            ; varatun muistin osoite
  62.     beq    dir_err            ; ei saatu muistia -> pois
  63.  
  64.     move.l    a2,d1            ; kohteen nimi
  65.     moveq    #SHARED_LOCK,d2        ; Lock-tyyppi
  66.     dos    Lock            ; lukitaan kohde
  67.     move.l    d0,d6            ; lockin osoite
  68.     beq    dir_err            ; ei saatu lukittua -> pois
  69.  
  70.     move.l    d6,d1            ; Lock
  71.     move.l    d7,d2            ; FileInfoBlock
  72.     dos    Examine            ; tutkitaan hakemistoa
  73.     tst.l    d0            ; virhe?
  74.     beq    dir_err            ; jop -> pois
  75.  
  76.     move.l    d7,a3            ; FileInfoBlock
  77.     tst.l    fib_DirEntryType(a3)    ; onko olio hakemisto?
  78.     bmi    dir_fil            ; ei, vaan tiedosto -> hypi
  79.  
  80.     move.l    d6,d1            ; Lock
  81.     dos    CurrentDir        ; mennään hakemistoon sisälle
  82.     move.l    d0,d4            ; entinen dir talteen
  83.  
  84. dir_lp    moveq    #0,d0            ; tarkistetaanko, painettiinko
  85.     moveq    #0,d1            ; CTRL+C
  86.     bset    #12,d1
  87.     exec    SetSignal        ; tutkitaan signaalit
  88.     btst    #12,d0            ; CTRT+C?
  89.     beq    dir_cnt            ; ei -> jatketaan
  90.  
  91.     lea    fmtbrk(pc),a0        ; tulostetaan '*** break'
  92.     bsr    dpymsg
  93.     bra    dir_rrr            ; ja sitten pois täältä ja heti!
  94.  
  95. dir_cnt    move.l    d6,d1            ; Lock
  96.     move.l    d7,d2            ; FileInfoBlock
  97.     dos    ExNext            ; tutkitaan hakemiston oliota
  98.     tst.l    d0            ; virhe?
  99.     beq    dir_err            ; joo -> loppuiko hakemisto?
  100.  
  101.     move.l    d7,a3            ; FileInfoBlock
  102.     tst.l    fib_DirEntryType(a3)    ; onko olio hakemisto?
  103.     bmi.s    dir_fil            ; ei, tiedosto -> hyppää
  104.  
  105.     lea    fib_FileName(a3),a3    ; hakemiston nimi...
  106.     move.l    a3,d1            ; ...d1:een
  107.     move.l    d5,d0            ; sisennys
  108.     lea    fmtdir(pc),a0        ; moutoilurivi
  109.     bsr    dpymsg            ; tulostetaan hakemiston nimi
  110.  
  111.     movem.l    d4-d7/a0-a2,-(sp)    ; rekisterit pinoon
  112.     subq.l    #2,d5            ; kasvatetaan sisennystä
  113.     move.l    a3,a2            ; alihakemiston nimi
  114.     bsr    dir_it            ; käsitellään alihakemisto
  115.     movem.l    (sp)+,d4-d7/a0-a2    ; rekisterit takaisin
  116.     tst.l    d0            ; virhe sisemmällä tasolla?
  117.     bne    dir_rrr            ; jep -> pois
  118.     bra.s    dir_lp
  119.  
  120. dir_fil    lea    fib_FileName(a3),a0    ; tiedoston nimi...
  121.     move.l    a0,d1            ; ...d1:een
  122.     move.l    fib_Size(a3),d2        ; tiedoston koko tavuina
  123.     move.l    d5,d0            ; sisennys
  124.     lea    fmtfile(pc),a0        ; muotoilurivi
  125.     bsr    dpymsg            ; tulostetaan nimi
  126.     move.l    d4,d0            ; tutkitaan, oliko käyttäjän
  127.     addq.l    #1,d0            ; antama kohde tiedosto.  Jos oli,
  128.     bne    dir_lp            ; homma on selvä.
  129.     bra.s    dir_rrr
  130.  
  131. dir_err    dos    IoErr            ; luetaan virhe dossilta
  132.     cmp.l    #ERROR_NO_MORE_ENTRIES,d0 ; hakemisto lopussa?
  133.     bne.s    100$            ; ei -> tulostetaan virhe
  134.     bsr.s    dir_cu            ; joo -> kaikki hyvin, pois!
  135.     moveq    #0,d0            ; ei virhettä
  136.     rts
  137. 100$    lea    fmterr(pc),a0        ; virheen muotoilu...
  138.     bsr    dpymsg            ; ...ja tulostus
  139. dir_rrr    bsr.s    dir_cu            ; siivotaan jäljet
  140.     moveq    #-1,d0            ; virhe ylemmälle tasolle
  141.     rts
  142.  
  143. dir_cu    move.l    d4,d1            ; entinen dir
  144.     addq.l    #1,d4            ; -1 (ei ole CurrentDirrattu) ?
  145.     beq.s    90$            ; joop -> hypitään yli
  146.     dos    CurrentDir        ; mennään takaisin sinne
  147. 90$    tst.l    d7            ; muisti varattu?
  148.     beq.s    100$
  149.     move.l    d7,a1            ; jep, vapautetaan se
  150.     move.l    #fib_SIZEOF,d0
  151.     exec    FreeMem
  152. 100$    move.l    d6,d1            ; Lock?
  153.     beq.s    110$
  154.     dos    UnLock            ; jep, vapautetaan
  155. 110$    rts
  156.  
  157.  
  158.  
  159. dpymsg    movem.l    d0-d7/a0-a3,-(sp)    ; rekisterit pinoon
  160.     move.l    sp,a1            ; osoitin datarekistereihin pinossa
  161.     lea.l    putchar(pc),a2        ; putchar-rutiinin osoite
  162.     move.l    a5,a3            ; puskurin osoite
  163.     exec    RawDoFmt        ; formatoidaan tulostus
  164.     dos    Output            ; tulostustiedoston filehandle
  165.     move.l    d0,d1
  166.     beq.s    201$            ; jos nolla, ei voida tulostaa
  167.     move.l    a3,d2
  168. 200$    tst.b    (a3)+            ; lasketaan merkkijonon pituus
  169.     bne.s    200$
  170.     subq.w    #1,a3            ; NULL-tavua ei lasketa
  171.     move.l    a3,d3            ; pituus d3:een
  172.     sub.l    d2,d3
  173.     dos    Write            ; tulostetaan puskurin sisältö
  174. 201$    movem.l    (sp)+,d0-d7/a0-a3
  175.     rts
  176. putchar    move.b    d0,(a3)+        ; putchar-rutiini RawDoFmt:lle
  177.     rts
  178.  
  179. ;;;; muotoilurivit RawDoFmt-tulostukseen
  180. fmtdir    dc.b    $9b,'1m%s%s',$9b,'0m',10,0
  181. fmtfile    dc.b    '%s%-34.34s  (%6.6ld tavua)',10,0
  182. fmterr    dc.b    '*** dos-virhe %ld',10,0
  183. fmtbrk    dc.b    '*** break',10,0
  184. spcs    dc.b    '                    '
  185. spce    dc.b    0
  186.  
  187. dosname    dc.b    'dos.library',0
  188.  
  189.     end
  190.  
  191.  
  192.